﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Diagnostics;

namespace IDE
{
    public partial class Conteiner : Form
    {
        Editor ed = new Editor();
        Parameter pa = new Parameter();
        String nombreArchivo = "";
        vmScreen cmd;
        
        public Conteiner()
        {
            InitializeComponent();
            espanolToolStripMenuItem.Checked = false;
            englishToolStripMenuItem.Checked = true;
            ingles();
        }
        //Nuevo Menú
        private void nuevoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ed.Dispose();
            ed = new Editor();
            ed.MdiParent = this;
            ed.Show();
        }
        //Botón nuevo
        private void btnNuevo_Click(object sender, EventArgs e)
        {
            ed.Dispose();
            ed = new Editor();
            ed.MdiParent = this;
            ed.Show();
        }
        //Click en Ingles
        private void englishToolStripMenuItem_Click(object sender, EventArgs e)
        {
            espanolToolStripMenuItem.Checked = false;
            englishToolStripMenuItem.Checked = true;
            ingles();
        }
        //Click en Español
        private void espanolToolStripMenuItem_Click(object sender, EventArgs e)
        {
            englishToolStripMenuItem.Checked = false;
            espanolToolStripMenuItem.Checked = true;
            espanol();
        }
        //Cargar Contenedor
        private void Conteiner_Load(object sender, EventArgs e)
        {

        }
        //Abrir Archivo Menú
        private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {

                ArrayList lineas = new ArrayList();
                String filename = openFileDialog1.FileName;
                StreamReader f = new StreamReader(new FileStream(filename, FileMode.Open));

                String linea;

                while ((linea = f.ReadLine()) != null)
                {
                    lineas.Add(linea);
                }

                f.Close();
                String texto = "";
                foreach (String l in lineas)
                {
                    texto = texto + l + "\r\n";

                }
                ed.Dispose();
                ed = new Editor();
                ed.MdiParent = this;
                ed.Show();
                ed.getTextBox().Text = texto;

                ed.Text = filename;
                nombreArchivo = filename;
            }
        }
        //Parámetros
        private void parámetrosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pa.Dispose();
            pa = new Parameter();
            pa.MdiParent = this;
            pa.Show();
        }
        //Abrir Archivo Botón
        private void btnAbrir_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {

                ArrayList lineas = new ArrayList();
                String filename = openFileDialog1.FileName;
                StreamReader f = new StreamReader(new FileStream(filename, FileMode.Open));

                String linea;

                while ((linea = f.ReadLine()) != null)
                {
                    lineas.Add(linea);
                }

                f.Close();
                String texto = "";
                foreach (String l in lineas)
                {
                    texto = texto + l + "\r\n";

                }
                ed.Dispose();
                ed = new Editor();
                ed.MdiParent = this;
                ed.Show();
                ed.getTextBox().Text = texto;

                ed.Text = filename;
                nombreArchivo = filename;
            }
        }
        //Botón Guardar
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (!nombreArchivo.Equals(""))
            {
                using (StreamWriter f = new StreamWriter(new FileStream(nombreArchivo, FileMode.Create)))
                {
                    f.Write(ed.getTextBox().Text);
                }
                string msg;
                if (espanolToolStripMenuItem.Checked)
                {
                    msg = "Guardado con éxito";
                }
                else
                {
                    msg = "Successfully saved";
                }
                MessageBox.Show(msg, "Info.", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    nombreArchivo = saveFileDialog1.FileName;
                    using (StreamWriter f = new StreamWriter(new FileStream(nombreArchivo, FileMode.Create)))
                    {
                        ed.Text = nombreArchivo;
                        f.Write(ed.getTextBox().Text);
                    }
                }

            }
        }
        //Guardar Menú
        private void guardarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!nombreArchivo.Equals(""))
            {
                using (StreamWriter f = new StreamWriter(new FileStream(nombreArchivo, FileMode.Create)))
                {
                    f.Write(ed.getTextBox().Text);
                }
                string msg;
                if (espanolToolStripMenuItem.Checked)
                {
                    msg = "Guardado con éxito";
                }
                else
                {
                    msg = "Successfully saved";
                }
                MessageBox.Show(msg, "Info.", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    nombreArchivo = saveFileDialog1.FileName;
                    using (StreamWriter f = new StreamWriter(new FileStream(nombreArchivo, FileMode.Create)))
                    {
                        ed.Text = nombreArchivo;
                        f.Write(ed.getTextBox().Text);
                    }
                }

            }
        }
        //Copiar Menú
        private void copiarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (ed.getTextBox().SelectionLength > 0)
            {
                ed.getTextBox().Copy();
            }
            else
            {
                string msg;
                if (espanolToolStripMenuItem.Checked)
                {
                    msg = "Seleccione texto a copiar";
                }
                else
                {
                    msg = "Select text to copy";
                }
                MessageBox.Show(msg,
                        "Important Note", MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation,
                        MessageBoxDefaultButton.Button1);
            }
        }
        //Pegar Menú
        private void pegarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Text) == true)
            {
                ed.getTextBox().Paste();
                Clipboard.Clear();
            }
        }
        //Copiar Botón
        private void btnCopiar_Click(object sender, EventArgs e)
        {
            if (ed.getTextBox().SelectionLength > 0)
            {
                ed.getTextBox().Copy();
            }
            else
            {
                string msg;
                if (espanolToolStripMenuItem.Checked)
                {
                    msg = "Seleccione texto a copiar";
                }
                else
                {
                    msg = "Select text to copy";
                }
                MessageBox.Show(msg,
                        "Important Note", MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation,
                        MessageBoxDefaultButton.Button1);
            }
        }
        //Pegar Botón
        private void btnPegar_Click(object sender, EventArgs e)
        {
            if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Text) == true)
            {
                ed.getTextBox().Paste();
                Clipboard.Clear();
            }
        }

        private void btnAnalizar_Click(object sender, EventArgs e)
        {   
            ed.getTextBox().Text = ed.txtCode.Text;
            ed.getConsole().Items.Clear();
            if (!nombreArchivo.Equals(""))
            {
                if (ed.getTextBox().Text.Equals(""))
                {
                    string msg;
                    if (espanolToolStripMenuItem.Checked)
                    {
                        msg = "El Editor se encuentra vacio, agregue el código para ser Analizado!";
                    }
                    else
                    {
                        msg = "The editor is empty, please insert the code to be analized";
                    }
                    MessageBox.Show(msg, "Important Note",
                        MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                }
                else
                {
                    //guarda el contenido en txtContenido en el archivo nuevo que se creo
                    //---------------------------------------------------------------
                    if (!nombreArchivo.Equals(""))
                    {
                        using (StreamWriter f = new StreamWriter(new FileStream(nombreArchivo, FileMode.Create)))
                        {
                            f.Write(ed.getTextBox().Text);
                        }
                        string msg;
                        if (espanolToolStripMenuItem.Checked)
                        {
                            msg = "Guardado con éxito";
                        }
                        else
                        {
                            msg = "Successfully saved";
                        }
                        //   MessageBox.Show(msg, "Info.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            nombreArchivo = saveFileDialog1.FileName;
                            using (StreamWriter f = new StreamWriter(new FileStream(nombreArchivo, FileMode.Create)))
                            {
                                ed.Text = nombreArchivo;
                                f.Write(ed.getTextBox().Text);
                            }
                        }

                    }

                    String rutaExe = "..\\..\\..\\Debug\\Parser.exe";//"parser\\Debug\\Parser.exe";
                    int idio;
                    if (englishToolStripMenuItem.Checked)
                    {
                        idio = 0;
                    }
                    else
                    {
                        idio = 1;
                    }
                    System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + rutaExe + " " + nombreArchivo + " " + idio + " " + pa.getMaxLinea().Text + " " + pa.getMaxDigit().Text + " " + pa.getMaxId().Text + " " + pa.getLongFecha().Text);
                    procStartInfo.RedirectStandardOutput = true;
                    procStartInfo.UseShellExecute = false;
                    procStartInfo.CreateNoWindow = true;
                    System.Diagnostics.Process proc = new System.Diagnostics.Process();
                    proc.StartInfo = procStartInfo;
                    proc.Start();
                    string result = proc.StandardOutput.ReadToEnd();
                    string[] resultado = result.Split("\n".ToCharArray());

                    ed.getConsole().Items.AddRange(resultado);

                    int end = result.LastIndexOf('@');
                    Boolean flag = true;

                    string numLinea;
                    int cont = 0;

                    while (cont < (resultado.Length - 1))
                    {
                        string linea = resultado[cont];
                        if (linea.LastIndexOf('#') != -1)
                        {
                            flag = false;
                            if (cmd != null)
                            {
                                cmd.Dispose();
                            }
                            numLinea = linea.Substring(linea.LastIndexOf('#') + 1);
                            paintLine(Convert.ToInt32(numLinea));
                        }
                        cont++;
                    }

                    if (flag)
                    {
                      
                        //llamada a la máquina virtual
                        String rutaExe2 = "..\\..\\..\\..\\VirtualMachine\\Debug\\VirtualMachine.exe";
                        String nombreArchivo2 = nombreArchivo;
                        int namelen = nombreArchivo2.Length;

                        String arch = nombreArchivo2.Substring(0, (namelen - 3)) + "p";
                        System.Diagnostics.ProcessStartInfo procStartInfo2 = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + rutaExe2 + " " + arch);//+" "+idio);
                        procStartInfo2.RedirectStandardOutput = true;
                        procStartInfo2.UseShellExecute = false;
                        procStartInfo2.CreateNoWindow = true;
                        System.Diagnostics.Process proc2 = new System.Diagnostics.Process();
                        proc2.StartInfo = procStartInfo2;
                        proc2.Start();

                        string result2 = proc2.StandardOutput.ReadToEnd();
                        string[] resultado2 = result2.Split("\n".ToCharArray());

                        //vmScreen cmd = new vmScreen();
                        if (cmd != null)
                        {
                            cmd.Dispose();
                        }
                        cmd = new vmScreen();
                        cmd.MdiParent = this;
                        cmd.Text = "Máquina Virtual PL3 - " + arch;
                        cmd.Show();
                        cmd.getVmScreen().Items.AddRange(resultado2);
                    }
                    else if (cmd != null)
                    {
                        cmd.Dispose();
                    }
                    flag = true;
                }
            }
            else
            {
                string msg2;
                if (espanolToolStripMenuItem.Checked)
                {
                    msg2 = "Debe crear un nuevo archivo!";
                }
                else
                {
                    msg2 = "You must create a new file";
                }
                MessageBox.Show(msg2, "Important Note",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }
        }

        private void parámetrosToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            pa.Dispose();
            pa = new Parameter();
            pa.MdiParent = this;
            pa.Show();

        }

        private void bloqueToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\bloque.png");
            else
                Process.Start("..\\..\\..\\diagramas\\bloque_esp.png");
        }

        private void declaracionParametrosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\declaracionParametros.png");
            else
                Process.Start("..\\..\\..\\diagramas\\declaracionParametros_esp.png");
        }

        private void expresionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\expresion.png");
            else
                Process.Start("..\\..\\..\\diagramas\\expresion_esp.png");
        }

        private void factorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\factor.png");
            else
                Process.Start("..\\..\\..\\diagramas\\factor_esp.png");
        }

        private void instruccionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\instruccion.png");
            else
                Process.Start("..\\..\\..\\diagramas\\instruccion_esp.png");
        }

        private void programaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\programa.png");
            else
                Process.Start("..\\..\\..\\diagramas\\programa_esp.png");
        }

        private void terminoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (englishToolStripMenuItem.Checked)
                Process.Start("..\\..\\..\\diagramas\\termino.png");
            else
                Process.Start("..\\..\\..\\diagramas\\termino_esp.png");
        }
    }
}
